// 121. 买卖股票的最佳时机
// 给定一个数组 prices ，它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

// 你只能选择 某一天 买入这只股票，并选择在 未来的某一个不同的日子 卖出该股票。
// 设计一个算法来计算你所能获取的最大利润。

// 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润，返回 0 。

// 示例 1：

// 输入：[7,1,5,3,6,4]
// 输出：5
// 解释：在第 2 天（股票价格 = 1）的时候买入，在第 5 天（股票价格 = 6）的时候卖出，
// 最大利润 = 6-1 = 5 。
// 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格；同时，
// 你不能在买入前卖出股票。

// 思路：分为两种情况 dp[i][0]表示第i天持有股票所得最多现金 
// dp[i][1]表示第i天卖出股票所得最多现金
// 初始化dp dp[0][0]=-prices[0] 其他都初始化为0
// 如果第i天持有股票即dp[i][0]， 那么可以由两个状态推出来

// 第i-1天就持有股票，那么就保持现状，所得现金就是昨天持有股票的所得现金 
// 即：dp[i - 1][0]
// 第i天买入股票，所得现金就是买入今天的股票后所得现金即：-prices[i]
// 那么dp[i][0]应该选所得现金最大的，所以
// dp[i][0] = max(dp[i - 1][0], -prices[i]);

// 如果第i天不持有股票即dp[i][1]， 也可以由两个状态推出来

// 第i-1天就不持有股票，那么就保持现状，所得现金就是昨天不持有股票的所得现金 
// 即：dp[i - 1][1]
// 第i天卖出股票，所得现金就是按照今天股票佳价格卖出后所得现金即：
// prices[i] + dp[i - 1][0]
// 同样dp[i][1]取最大的，dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
/**
 * @param {number[]} prices
 * @return {number}
 */
 var maxProfit = function(prices) {
    const dp=new Array(prices.length+1).fill([0,0]);
    dp[0][0]=-prices[0];
    for(let i=1;i<prices.length;i++){
        dp[i]=[
            Math.max(dp[i-1][0],-prices[i]),
            Math.max(dp[i-1][1],dp[i-1][0]+prices[i])
    ]
    }
    return dp[prices.length-1][1];
 }

/**
 * @param {number[]} prices
 * @return {number}
 */
 var maxProfit = function(prices) {
    const dp=new Array(prices.length+1).fill([0,0]);
    dp[0][0]=-prices[0];
    dp[0][1]=0;
    for(let i=1;i<prices.length;i++){
        dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i]);
        dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);
    }
    return dp[prices.length -1][1];
};